package com.ycsd.invest.order.business.opplugin;

import cn.hutool.core.util.StrUtil;
import com.ycsd.invest.order.common.utils.DynamicObjectUtil;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.metadata.IDataEntityProperty;
import kd.bos.dataentity.metadata.IDataEntityType;
import kd.bos.dataentity.metadata.clr.CollectionProperty;
import kd.bos.dataentity.metadata.clr.ComplexProperty;
import kd.bos.entity.ExtendedDataEntity;
import kd.bos.entity.formula.RowDataModel;
import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
import kd.bos.entity.plugin.AddValidatorsEventArgs;
import kd.bos.entity.plugin.PreparePropertysEventArgs;
import kd.bos.entity.plugin.args.BeforeOperationArgs;
import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
import kd.bos.entity.validate.AbstractValidator;
import kd.bos.servicehelper.BusinessDataServiceHelper;

import java.util.HashMap;
import java.util.Map;

/**
 * 操作插件
 */
public class TestStudyOp extends AbstractOperationServicePlugIn {

    /**
     * 操作执行，加载单据数据包之前，触发此事件；
     *
     * @remark
     * 在单据列表上执行单据操作，传入的是单据内码；
     * 系统需要先根据传入的单据内码，加载单据数据包，其中只包含操作要用到的字段，然后再执行操作；
     * 在加载单据数据包之前，操作引擎触发此事件；
     *
     * 插件需要在此事件，添加需要用到的字段；
     * 否则，系统加载的单据数据包，可能没有插件要用到的字段值，从而引发中断
     */
    @Override
    public void onPreparePropertys(PreparePropertysEventArgs e) {
        // 要求加载字段
        e.getFieldKeys().add("form_title");
        e.getFieldKeys().add("form_link");
        e.getFieldKeys().add("come_data");
        e.getFieldKeys().add("valid");
        System.out.println(e.getFieldKeys());
    }

    /**
     * 构建好操作校验器之后，执行操作校验之前，触发此事件
     * @param e
     */
    @Override
    public void onAddValidators(AddValidatorsEventArgs e) {

        //获取操作参数
        Map<String, String> stringMap = this.operateOption.getVariables();
        if (stringMap != null) {
            String amonut = stringMap.get("amonut");
            String billno = stringMap.get("billno");
            String number = stringMap.get("number");

        }
        e.addValidator(new AbstractValidator() {
            @Override
            public void validate() {
                // 定义一个行数据存取模型：用于方便的读取本实体、及父实体、单据头上的字段
                RowDataModel rowDataModel = new RowDataModel(this.entityKey, this.getValidateContext().getSubEntityType());

                if (this.getDataEntities() == null || this.getDataEntities().length <= 0) {
                    return;
                }
                // 逐行校验
                for(ExtendedDataEntity rowDataEntity : this.getDataEntities()){
                    HashMap<String, Object> map = DynamicObjectUtil.readPropValue(rowDataEntity.getDataEntity());
                    Object title = map.get("form_title");
                    Object link = map.get("form_link");
                    Object come_data = map.get("come_data");
                    Object valid = map.get("valid");
//                    if (valid instanceof Boolean && (boolean) valid) {
//                        this.addMessage(rowDataEntity,
//                                String.format("title: %s, link: %s, date: %s", title, link, come_data));
//                    }
                }
            }
        });
    }

    /**
     * 插件可以在此事件，对已经通过校验的数据，进行整理，或者取消操作的执行。
     * 这个事件触发时，还没有启动事务保护，请勿在此修改数据库数据。
     * @param e
     */
    @Override
    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
        super.beforeExecuteOperationTransaction(e);
    }

    /**
     * 操作校验通过，开启了事务之后，还没有把数据提交到数据库之前触发此事件。
     * @param e
     */
    @Override
    public void beginOperationTransaction(BeginOperationTransactionArgs e) {

//        e.setCancelOperation(true);
//        for (DynamicObject dataEntity : e.getDataEntities()) {
//            String id = dataEntity.get("id").toString();
//            if (StrUtil.isNotBlank(id)) {
//
//                //通过BusinessDataServiceHelper.loadSingle获取单据体数据
//                DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, "ycsd_study_form");
//                if(Boolean.TRUE.equals(dynamicObject.getBoolean("fvalid"))) {
//                    e.setCancelOperation(true);
//                }
//                HashMap<String, Object> map = DynamicObjectUtil.readPropValue(dynamicObject);
//                Object ftitle = map.get("form_title");
//
//                //获取单据体数据，返回DynamicObjectCollection集合对象
//                DynamicObjectCollection entryentity = dynamicObject.getDynamicObjectCollection("languages");
//                //遍历集合获取单据体字段值
//            }
//
//        }
    }


}
